﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bibilioteca.DataAccess;
using Bibilioteca.Models;
using System.Data;

namespace Bibilioteca.Dominio
{
    public class NegocioMateriales
    {

        private MaterialesDao materialesDao;
        private NegocioTiposMateriales tiposMateriales;
        private NegocioEditoriales editoriales;
        private NegocioCatalogos catalogos;
        //private AutoresDao autoresDao;
        private NegocioAutores autores;

        public NegocioMateriales()
        {
            materialesDao = new MaterialesDao();
            tiposMateriales = new NegocioTiposMateriales();
            editoriales = new NegocioEditoriales();
            catalogos = new NegocioCatalogos();
            //autoresDao = new AutoresDao();
            autores = new NegocioAutores();
        }

        /*
         * Genera a partir de un dataTable un LinkedList.
         * Esto es simplemente porque desde la vista no se puede iterar
         * sobre un datatable, se necesita una coleccion de materiales.
         */
        private LinkedList<Material> generarListaMateriales(DataTable tabla)
        {
            LinkedList<Material> retorno = new LinkedList<Material>();
            foreach (DataRow row in tabla.Rows)
            {
                string autoresString = "";
                bool primerAutor = true;
                foreach (Autor row2 in autores.GetAutoresDeMaterial(Convert.ToString(row["material_id"])))
                {
                    if (!primerAutor)
                        autoresString += ",";
                    else
                        primerAutor = false;
                    autoresString += Convert.ToString(row2.Id);
                }
                Material s = new Material(Convert.ToInt32(row["material_id"]), 
                                        Convert.ToString(row["material_codigo"]), 
                                        Convert.ToString(row["material_titulo"]),
                                        Convert.ToInt32(row["material_tipo_id"]),
                                        Convert.ToString(row["material_sinopsis"]),
                                        Convert.ToInt32(row["material_editorial_id"]),
                                        Convert.ToInt32(row["material_catalogo_id"]),
                                        autoresString
                                        );
                retorno.AddLast(s);
            }
            return retorno;
        }

        /*
         * Retorna una lista enlazada de todos los materiales en la BD.
         */
        public LinkedList<Material> todosLosMateriales()
        {
            return generarListaMateriales(materialesDao.todosLosMateriales());
        }

        /*
         * Dado un numero de material lo busca en la BD y lo retorna.
         */
        public Material GetMaterialNumero(string id)
        {
            materialesDao.paramID = Convert.ToInt32(id.Trim());
            DataTable materialTable = materialesDao.GetMaterialNumero();
            foreach (DataRow row in materialTable.Rows)
            {
                string autoresString = "";
                bool primerAutor = true;
                foreach (Autor row2 in autores.GetAutoresDeMaterial(Convert.ToString(row["material_id"])))
                {
                    if (!primerAutor)
                        autoresString += ",";
                    else
                        primerAutor = false;
                    autoresString += Convert.ToString(row2.Id);
                }
                Material s = new Material(Convert.ToInt32(row["material_id"]),
                                        Convert.ToString(row["material_codigo"]),
                                        Convert.ToString(row["material_titulo"]),
                                        Convert.ToInt32(row["material_tipo_id"]),
                                        Convert.ToString(row["material_sinopsis"]),
                                        Convert.ToInt32(row["material_editorial_id"]),
                                        Convert.ToInt32(row["material_catalogo_id"]),
                                        autoresString
                                        );
                return s;
            }
            return new Material(0);
        }

        public void modificarMaterial(Material material)
        {
            materialesDao.paramID = material.Id;
            materialesDao.codigo = material.Codigo;
            materialesDao.titulo = material.Titulo;
            materialesDao.tipoId = material.SelectedTipoMaterial;
            materialesDao.sinopsis = material.Sinopsis;
            materialesDao.editorialId = material.SelectedEditorial;
            materialesDao.catalogoId = material.SelectedCatalogo;
            materialesDao.autores = material.Autores;

            if (material != null && material.Id != 0)
                materialesDao.modificarMaterial();
        }

        public void insertarMaterial(Material material)
        {
            materialesDao.codigo = material.Codigo;
            materialesDao.titulo = material.Titulo;
            materialesDao.tipoId = material.SelectedTipoMaterial;
            materialesDao.sinopsis = material.Sinopsis;
            materialesDao.editorialId = material.SelectedEditorial;
            materialesDao.catalogoId = material.SelectedCatalogo;
            materialesDao.autores = material.Autores;

            materialesDao.insertarMaterial();
        }

        public void eliminarMaterial(int id)
        {
            materialesDao.paramID = id;
            if (id != 0)
                materialesDao.eliminarMaterial();
        }

    }
}